UIViewController 的 init 和 viewDidLoad 执行顺序带来的有趣现象
Contents
这是一个 vc 的 init 方法。
- (instancetype)init {
self = [super init];
if (self) {
//do bala bala
}
return self;
}
这是一个 vc 的 viewDidLoad 方法。
- (void)viewDidLoad {
[super viewDidLoad];
}
通常情况下 init 会先执行(实际上一直都是先执行)。
然而,如果在 init 中有调用 self.view (Access to the view)的动作的话,情况就变得不一样了。
- (instancetype)init {
self = [super init];
if (self) {
UITableView *tableView = [UITableView new];
[self.view addSubView:v];
}
return self;
}
vc 会从 self = [super init]; 开始执行一直走到 [self.view addSubView:v]; 之前提前跳到 viewDidLoad 方法,执行完毕才会回到 [self.view addSubView:v]; 继续执行。
试想一下,如果在
viewDidLoad中设置了一个 hud 并且是 add 到self.view上的,按照这个顺序,接下来self.view中会在init方法中 add 一个UITableView。这样一来根据 add 的先后顺序,hud 会在UITableView的下方不可见。如果在
init方法中有对NSMutableArray类似的变量初始化动作NSMutableArray *array = [@[] mutableCopy];
且 viewDidLoad 中有用到的话由于还没有来得及初始化就发送消息,addObject 这样的操作便是无效的。
